package edu.nf.ch11.pool;

import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.LinkedHashSet;

/**
 * @author CSY
 * @date 2025 - 04 - 18
 * 连接池
 */
public class ConnectionPool {
    //连接池
    private LinkedHashSet<Connection> pool = new LinkedHashSet<>();

    /**
     * 构造方法初始化池
     * @param initSize 池的最大容量
     */
    public ConnectionPool(int initSize) {
        for (int i = 0; i < initSize; i++) {
            Connection conn = DbUtil.getConnection();
            conn = createProxy(conn);

            //将代理放到连接池中
            pool.add(conn);
        }
    }

    /**
     * 创建代理
     * @param conn
     * @return
     */
    private Connection createProxy(Connection conn) {
        //获取类加载器
        ClassLoader loader =ConnectionPool.class.getClassLoader();
        Class<?>[] interfaces = new Class[]{Connection.class};
        return (Connection)Proxy.newProxyInstance(loader,interfaces,
                ((proxy, method, args) -> {
                    if (method.getName().equals("close")) {
                        //注意：强转为Connection接口
                        pool.addLast((Connection)proxy);
                        return null;
                    }
                    return method.invoke(conn, args);
                }));
    }

    public Connection get(){
        return pool.removeFirst() ;
    }

    /**
     * 连接池的大小
     * @return
     */
    public int size(){
        return pool.size();
    }

}
